package logger

import (
	"fmt"
	"os"
	"path/filepath"
	"time"

	"github.com/sirupsen/logrus"
)

var logger *logrus.Logger

// Init 初始化日志系统
func Init() error {
	logger = logrus.New()

	// 设置日志格式
	logger.SetFormatter(&logrus.TextFormatter{
		FullTimestamp:   true,
		TimestampFormat: "2006-01-02 15:04:05",
	})

	// 创建日志目录
	logDir := "logs"
	if err := os.MkdirAll(logDir, 0755); err != nil {
		return fmt.Errorf("创建日志目录失败: %v", err)
	}

	// 生成CLI日志文件名 (按小时)
	now := time.Now()
	logFileName := fmt.Sprintf("cli-%s.log", now.Format("2006-01-02-15"))
	logFilePath := filepath.Join(logDir, logFileName)

	// 打开日志文件
	logFile, err := os.OpenFile(logFilePath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
	if err != nil {
		return fmt.Errorf("打开日志文件失败: %v", err)
	}

	// 设置日志输出 - 只输出到文件，不输出到控制台
	logger.SetOutput(logFile)
	logger.SetLevel(logrus.InfoLevel)

	logger.Info("日志系统已初始化，输出到文件: " + logFilePath)
	return nil
}

// SetDebugMode 设置调试模式
func SetDebugMode(enabled bool) {
	if logger == nil {
		return
	}

	if enabled {
		logger.SetLevel(logrus.DebugLevel)
		logger.Info("调试日志已启用")
	} else {
		logger.SetLevel(logrus.InfoLevel)
		logger.Info("调试日志已禁用")
	}
}

// SetOutput 设置输出目标
func SetOutput(output string) {
	if logger == nil {
		return
	}

	switch output {
	case "stdout":
		logger.SetOutput(os.Stdout)
	case "file":
		// 使用默认的日志文件
		logDir := "logs"
		now := time.Now()
		logFileName := fmt.Sprintf("log%s.log", now.Format("20060102_15"))
		logFilePath := filepath.Join(logDir, logFileName)

		logFile, err := os.OpenFile(logFilePath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
		if err == nil {
			logger.SetOutput(logFile)
		}
	default:
		logger.SetOutput(os.Stdout)
	}
}

// Debug 调试级别日志
func Debug(format string, args ...interface{}) {
	if logger != nil {
		logger.Debugf(format, args...)
	}
}

// Info 信息级别日志
func Info(format string, args ...interface{}) {
	if logger != nil {
		logger.Infof(format, args...)
	}
}

// Warn 警告级别日志
func Warn(format string, args ...interface{}) {
	if logger != nil {
		logger.Warnf(format, args...)
	}
}

// Error 错误级别日志
func Error(format string, args ...interface{}) {
	if logger != nil {
		logger.Errorf(format, args...)
	}
}

// Fatal 致命错误级别日志
func Fatal(format string, args ...interface{}) {
	if logger != nil {
		logger.Fatalf(format, args...)
	}
}

// WithField 添加字段到日志
func WithField(key string, value interface{}) *logrus.Entry {
	if logger != nil {
		return logger.WithField(key, value)
	}
	return nil
}

// WithFields 添加多个字段到日志
func WithFields(fields logrus.Fields) *logrus.Entry {
	if logger != nil {
		return logger.WithFields(fields)
	}
	return nil
}
